package org.hales.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.security.MessageDigest;

@Component
public class MD5Util {

  private static final String hexDigits[] = {
    "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"
  };

  private static String passwordSalt;

  @Value("${password-salt:}")
  public void setPasswordSalt(String passwordSalt) {
    MD5Util.passwordSalt = passwordSalt;
  }

  public static String MD5EncodeUtf8(String origin) {
    origin = origin + passwordSalt;
    return MD5Encode(origin, "utf-8");
  }

  private static String MD5Encode(String origin, String charsetname) {
    String resultString = null;
    try {
      resultString = new String(origin);
      MessageDigest md = MessageDigest.getInstance("MD5");
      if (charsetname == null || "".equals(charsetname))
        resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
      else resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
    } catch (Exception exception) {
    }
    return resultString.toUpperCase();
  }

  private static String byteArrayToHexString(byte b[]) {
    StringBuffer resultSb = new StringBuffer();
    for (int i = 0; i < b.length; i++) resultSb.append(byteToHexString(b[i]));

    return resultSb.toString();
  }

  private static String byteToHexString(byte b) {
    int n = b;
    if (n < 0) n += 256;
    int d1 = n / 16;
    int d2 = n % 16;
    return hexDigits[d1] + hexDigits[d2];
  }

  public static void main(String[] args) {
    String password = "1qaz2wsx";
    password = password + "geelysdafaqj23ou89ZXcj@#$@#$#@KJdjklj;D../dSF.,";
    String res = MD5Encode(password, "utf-8");
    System.out.println(res);
  }
}
